package com.tuxing.draa_data.util;

import com.google.common.base.Strings;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 工具类
 * 格式化数据
 * @author yqliang
 * @date 2020/4/10 14:20
 * @version 1.0
 **/
@Slf4j
public class FormatUtil {

    /**
     * 格式化对应的值
     *
     * @param data 传入的内容
     * @return 格式化后的String值
     */
    public static String formatValue(Object data) {
        String value = "";
        if (data != null) {
            value = data.toString();
        }
        value = value.trim();
        return value;
    }

    /**
     * 格式化对应的值
     *
     * @param data 传入的内容
     * @return 格式化后的String值
     */
    public static int formatToInt(String data) {
        int value = 0;
        if (!Strings.isNullOrEmpty(data)) {
            value = Integer.parseInt(data);
        }
        return value;
    }

    /**
     * 格式化ISSN
     *
     * @param issn issn号
     */
    public static String formatISSN(String issn) {
        String ret = "";

        if (!Strings.isNullOrEmpty(issn)) {
            issn = issn.toLowerCase();

            issn = issn.replace(',', ' ');
            issn = issn.replace("\r\n", " ");
            issn = issn.replace(';', ' ');
            issn = issn.replace("null", "");
            issn = issn.replace("empty", "");
            issn = issn.replace("****-****", "");
            issn = issn.replace("*", "");
            issn = issn.replace("0000-0000", "");
            issn = issn.replace(" ", "");

            if (Strings.isNullOrEmpty(issn)) {
                return ret;
            }

            if (issn.contains("-") && issn.length() == 9) {
                return issn;
            }

            //因为高亮<em>00027863</em>
            boolean highLight = false;
            if (issn.contains("<em>")) {
                highLight = true;
                issn = issn.replace("<em>", "");
                issn = issn.replace("</em>", "");
            }

            if (!issn.contains("-")) {

                if (issn.length() < 8) {
                    int l = issn.length();
                    //长度小于8就往前补0补0
                    StringBuilder sb = new StringBuilder(issn);
                    for (int i = 0; i < 8 - l; i++) {
                        sb.insert(0, "0");
                    }
                    issn = sb.toString();
                }

                if (issn.length() == 8) {
                    StringBuilder sb = new StringBuilder(issn);
                    //在指定的位置，插入指定的字符串
                    sb.insert(4, "-");
                    ret = sb.toString();
                }

            } else {
                if (issn.indexOf("-") < 4) {
                    //有-，但是小于4说明最多3，说明最多长度为8，前面补个0即可
                    if (issn.length() < 9) {
                        int l = issn.length();
                        //长度小于8就往前补0补0
                        StringBuilder sb = new StringBuilder(issn);
                        for (int i = 0; i < 8 - l; i++) {
                            sb.insert(0, "0");
                        }
                        ret = sb.toString();
                    }
                } else {
                    ret = "";
                }
            }

            if (highLight) {
                ret = "<em>" + ret + "</em>";
            }

        }
        return ret;
    }


    /**
     * @param templete 格式化日期模板
     */
    public static String formatNowDate(String templete) {
        if (StringUtils.isNotBlank(templete)) {
            SimpleDateFormat as = new SimpleDateFormat(templete);
            return as.format(new Date());
        } else {
            return "";
        }
    }

    /**
     * 将String转换为double
     *
     * @param param 入参
     * @param defaultValue 默认值
     */
    public static Double objToDouble(String param, Double defaultValue) {
        if (StringUtils.isBlank(param)) {
            return defaultValue;
        }
        try {
            return Double.valueOf(param);
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /**
     * 将String转换为BigDecmil
     *
     * @param param 入参
     * @param defaultValue 默认值
     */
    public static BigDecimal objToBigDecmil(String param, BigDecimal defaultValue) {
        if (StringUtils.isBlank(param)) {
            return defaultValue;
        }
        try {
            return new BigDecimal(param);
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /**
     * 将String转换为String
     *
     * @param param 入参
     * @param defaultValue 默认值
     */
    public static String objToString(Object param, String defaultValue) {
        if (param == null) {
            return defaultValue;
        }
        try {
            return param.toString();
        } catch (Exception e) {
            return defaultValue;
        }
    }


    /**
     * 格式化ISBN
     *
     * @param isbn isbn号
     * @return 格式化后的isbn
     */
    public static String formatISBN(String isbn) {
        String ret = "";
        int size10 = 10;
        int size13 = 13;
        boolean highLight = false;

        try {

            if (!Strings.isNullOrEmpty(isbn)) {
                isbn = isbn.replace("'", "");
                isbn = isbn.replace("‘", "");
                isbn = isbn.replace("’", "");
                isbn = isbn.replace("·", "");
                isbn = isbn.replace(".", "");
                isbn = isbn.replace(",", "");
                isbn = isbn.replace("\r\n", "");
                isbn = isbn.replace("\t", "");
                isbn = isbn.replace(";", "");
                isbn = isbn.replace("-", "");
                isbn = isbn.replace("_", "");
                isbn = isbn.replace("null", "");
                isbn = isbn.replace("empty", "");
                isbn = isbn.replace("****-****", "");
                isbn = isbn.replace("*", "");
                isbn = isbn.replace(" ", "");
                isbn = isbn.replace("/r/n", "");
                isbn = isbn.replace("\"", "");
                isbn = isbn.replace("\\“", "");

                //因为高亮<em></em>
                if (isbn.contains("<em>")) {
                    highLight = true;
                    isbn = isbn.replace("<em>", "");
                    isbn = isbn.replace("</em>", "");
                }

                if (isbn.length() > 13) {
                    if (isbn.contains("RMB")) {
                        String[] isbnArray = isbn.split("RMB");
                        isbn = isbnArray[0];
                    }

                    isbn = isbn.replaceAll("\\D+", "");
                    if (isbn.length() > 10) {
                        String isbn3 = isbn.substring(0, 3);
                        if (!"978".equals(isbn3)) {
                            isbn = isbn.substring(0, 10);
                        }
                    }
                }

                if (isbn.length() != size13 && isbn.length() != size10) {
                    if (isbn.length() < size10) {
                        StringBuilder number = new StringBuilder();
                        for (int i = 0; i < size10 - isbn.length(); i++) {
                            number.append("0");
                        }
                        isbn = number + isbn;
                    } else {
                        if (isbn.length() == 14 && isbn.substring(12, 14).equals(Integer.toString(size10))) {
                            isbn = isbn.substring(0, 12) + "0";
                        } else {
                            log.error("ISBN号非法，转换必须为10位:" + isbn);
                            return ret;
                        }
                    }
                }

                if (isbn.length() == size10) {
                    isbn = convert10To13(isbn);
                }

                if (isbn.length() == 13) {
                    ret = isbn;
                } else {
                    log.error("ISBN号非法，" + isbn);
                }
            }
            if (highLight) {
                ret = "<em>" + ret + "</em>";
            }
        } catch (Exception ex) {
            log.error("ISBN号非法，" + isbn);
        }
        return ret;
    }

    /**
     * 将10位的ISBN转换为13位的
     *
     * @param pISBN10 10位的ISBN
     * @return 13位的ISBN
     */
    private static String convert10To13(String pISBN10) {
        String ret = "";
        if (!Strings.isNullOrEmpty(pISBN10)) {
            if (pISBN10.equals("0000000000")) {
                return ret;
            }

            int size13 = 13;
            int size10 = 10;

            if (pISBN10.length() == size13) {
                return pISBN10;
            }

            if (pISBN10.length() != size10) {
                log.error("ISBN号非法，转换必须为10位:" + pISBN10);
                return "";
            }
            String pISBN13 = "978" + pISBN10.substring(0, pISBN10.length() - 1);
            int a = 0;
            int b = 0;
            int c;
            int d;
            for (int i = 0; i < pISBN13.length(); i++) {
                int x = ConvertUtil.objToInt(pISBN13.substring(i, i + 1));
                if (i % 2 == 0) {
                    a += x;
                } else {
                    b += x;
                }
            }
            c = a + 3 * b;
            d = 10 - c % 10;
            if (d == 10) {
                d = 0;
            }
            pISBN13 = pISBN13 + d;
            return pISBN13;
        }
        return ret;
    }

    /**
     * 从13位到10位的计算方法 13位编号是9787111165613现在想把它转化位10位，
     * 去掉开头的”978″和最后一位校验码，变成711116561
     * 从第一位开始，将每一位和10到2的数字相乘，
     * 并求和；7*10 + 1*9 + 1* 8 + 1*7 + 1*6 + 6*5 + 5*4 + 6*3 + 1*2 = 170；记为sum
     * 求11 -余数 ：11 -(sum % 11) = 6；如果结果是10就记为X，
     * 然后把算出来的一位加到第一步结果的最后，
     * 得到10位编码为：7111165615
     *
     * @param isbn13 13位的ISBN
     * @return 10位的ISBN
     */
    public static String convert13To10(String isbn13) {
        String isbn10 = "";
        if (isbn13.length() == 10) {
            return isbn13;
        }

        if (isbn13.length() == 13) {

            //去掉开头的978和最后一位数字
            isbn10 = isbn13.substring(3, isbn13.length() - 1);

            int number = 10;
            int sum = 0;
            for (int i = 0; i < isbn10.length(); i++) {
                int x = ConvertUtil.objToInt(isbn10.substring(i, i + 1));
                sum += x * (number - i);
            }
            int last = 11 - (sum % 11);
            if (last == 10) {
                isbn10 += "X";
            } else {
                isbn10 += last;
            }
        }
        return isbn10;
    }

    /**
     * 格式化期刊的名称的,去掉所有的符号、空格和只保留汉字和字母
     *
     * @param name 期刊的名称
     * @return 格式化后期刊名称
     */
    public static String formatJournalName(String name) {

        if (Strings.isNullOrEmpty(name)) {
            return "";
        }
        name = name.replaceAll("[^a-zA-Z0-9\\u4E00-\\u9FA5]", "");
        name = name.replaceAll("[\\s*|\t|\r|\n]", "");
        name = name.trim();
        return name;

//        "ACM-航空学会期刊A"
    }
}
